package xiangmu.schoolpaper.service.impl.system;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import xiangmu.schoolpaper.mapper.TemplateMapper;
import xiangmu.schoolpaper.mapper.system.SystemTemplateManagementMapper;
import xiangmu.schoolpaper.pojo.DTO.*;
import xiangmu.schoolpaper.pojo.VO.*;
import xiangmu.schoolpaper.pojo.entity.Template;
import xiangmu.schoolpaper.service.system.SystemTemplateManagementService;

import java.util.List;

@Service
public class SystemTemplateManagementServiceImpl implements SystemTemplateManagementService {

    @Autowired
    private SystemTemplateManagementMapper systemTemplateManagementMapper;
    @Autowired
    private TemplateMapper templateMapper;

    //    3分页查询所有符合筛选条件的模板记录
    @Override
    public IPage<SystemTemplatesInfoVO> getAllTemplatesByPages(
            Integer currentPage,
            Integer pageSize,
            Integer facultyId,
            String major,
            String type
    ) {
        Page<SystemTemplatesInfoVO> page = new Page<>(currentPage, pageSize);
        return systemTemplateManagementMapper.getAllTemplatesByPages(page, facultyId, major, type);
    }

//    4修改模板启用状态
    @Override
    @Transactional
    public Integer updateTemplateStatusById(SystemTemplateStatusDTO systemTemplateStatusDTO) {
//        4-1查询当前模板信息
        Template current = templateMapper.selectById(systemTemplateStatusDTO.getTemplateId());
        if (current == null) {
            return -2; // 模板不存在
        }
//        4-2查同种模板下 status=1 的数量
        int enabledCount = systemTemplateManagementMapper.countEnabledTemplates(current.getMajorId(), current.getTypeId());
//        4-3如果用户想把唯一启用的设为0 → 拦截
        if ("0".equals(systemTemplateStatusDTO.getStatus()) && enabledCount == 1 && "1".equals(current.getStatus())) {
            return -1;
        }
//        4-4如果用户传的是1 → 执行“把它设为1，其余设为0”
        if ("1".equals(systemTemplateStatusDTO.getStatus())) {
            Boolean success = systemTemplateManagementMapper.updateTemplateStatusById(systemTemplateStatusDTO);
            if(success) {
                return 1;
            }
        }
//        4-5其他情况（比如本来是0改成0，或者1改成1）就忽略
        return 0;
    }

//    5根据ID查看某一条模板基本信息
    @Override
    public SystemTemplateOneByIdVO getTemplateOneById(Integer templateId) {
        return systemTemplateManagementMapper.getTemplateOneById(templateId);
    }

//    6修改某一条模板基本信息【已废弃****】
//    原方法逻辑复杂，设置只能修改模板名称
//        如果原来的status为0 修改后不影响
//        如果原来的status为1 修改后这个模板的status是1还是0 修改后同种类型原来为1的那个怎么办？并且如果这个status为1，他走了之后，原种模板谁status为1合适呢
//        有解决方案两种：1.原status为1的改为0，原种上一上传时间的status改为1；2.原status为1的改为1，原种上一上传时间的改为1，现种原来status为1的改为0
//        *但综合考虑，初版不做专业和模板类型的修改了
//    public Boolean updateTemplateOneById(SystemTemplateOneByIdDTO dto) {
////        1根据专业和模板类型名字查ID
////        StringUtils.hasText()能同时检查值为null、""、"空格"这三种情况是否存在
////        1-1找到专业ID
//        if (!StringUtils.hasText(dto.getMajorName())) {
//            Integer majorId = systemTemplateManagementMapper.getMajorIdByName(dto.getMajorName());
//            if (majorId == null) {
//                throw new RuntimeException("专业名称不存在: " + dto.getMajorName());
//            }
//            dto.setMajorId(majorId);
//        }
////        1-2找到模板类型ID
//        if (dto.getTypeName() != null && !dto.getTypeName().isEmpty()) {
//            Integer typeId = systemTemplateManagementMapper.getTypeIdByName(dto.getTypeName());
//            if (typeId == null) {
//                throw new RuntimeException("模板类型不存在: " + dto.getTypeName());
//            }
//            dto.setTypeId(typeId);
//        }
//
////        2查找当前模板的原始信息（用于判断是否改变了 major_id/type_id）
////        2-1查找当前模板原始信息
//        SystemTemplateOneByIdDTO old = systemTemplateManagementMapper.getTemplateById(dto.getTemplateId());
////        2-2比较修改信息与原始信息
////        2-2-1专业是否被修改
//        boolean majorChanged = dto.getMajorId() != null && !dto.getMajorId().equals(old.getMajorId());
////        2-2-2模板类型是否被修改
//        boolean typeChanged = dto.getTypeId() != null && !dto.getTypeId().equals(old.getTypeId());
//
////        3如果专业或类型变动，检查新组合下是否存在status=1的模板
//
//        if ((majorChanged || typeChanged) && old.getStatus() == 1) {
//            Integer count = systemTemplateManagementMapper.countActiveTemplate(dto.getMajorId(), dto.getTypeId());
//            if (count != null && count > 0) {
//                throw new RuntimeException("更新失败：该专业与模板类型下已有启用模板，请先停用原模板。");
//            }
//        }
//
////        2修改（根据模板名称、专业ID和模板类型ID修改）
//        Boolean update = systemTemplateManagementMapper.updateTemplateOneById(systemTemplateOneByIdDTO);
//        return update;
//    }

//    6修改某一条模板的模板名称
    @Override
    @Transactional
    public Boolean updateTemplateNameById(SystemTemplateOneByIdDTO systemTemplateOneByIdDTO) {
            if (systemTemplateOneByIdDTO.getTemplateName() != null && !systemTemplateOneByIdDTO.getTemplateName().isEmpty()) {
                Boolean success = systemTemplateManagementMapper.updateTemplateNameById(systemTemplateOneByIdDTO);
                return success;
            } else {
                throw new RuntimeException("更新失败：模板名称为空");
            }
        }

//    7根据ID查看某一条模板评分参数
    @Override
    public SystemTemplateParameterByIdVO getTemplateParameterById(Integer templateId) {
        return systemTemplateManagementMapper.getTemplateParameterById(templateId);
    }

//    8根据ID修改某一条模板评分参数
    @Override
    @Transactional
    public Boolean updateTemplateParameterById(SystemTemplateParameterByIdDTO systemTemplateParameterByIdDTO) {
        if(systemTemplateParameterByIdDTO.getTemplateId() != null) {
            Boolean success = systemTemplateManagementMapper.updateTemplateParameterById(systemTemplateParameterByIdDTO);
            return success;
        } else {
            throw new RuntimeException("更新失败！");
        }
    }

//    9根据ID查看某一条模板章节列表
    @Override
    public SystemTemplateChapterByIdVO getTemplateChapterById(Integer templateId) {
        // 9-1获取模板基本信息
        SystemTemplateChapterByIdVO vo = systemTemplateManagementMapper.getTemplateBasicInfoById(templateId);
        if (vo == null) {
            throw new RuntimeException("未找到对应模板信息");
        }

        // 9-2获取章节列表
        List<SystemTemplateChapterInfoVO> chapters = systemTemplateManagementMapper.getTemplateChaptersById(templateId);

        vo.setChapters(chapters);
        return vo;
    }

//    10根据ID查看某一条模板权重信息
    @Override
    public SystemTemplateWeightByIdVO getTemplateWeightOneById(Integer templateId) {
        // 1. 获取模板主信息
        SystemTemplateWeightByIdVO vo = systemTemplateManagementMapper.getTemplateBasicInfoById2(templateId);
        if (vo == null) {
            throw new RuntimeException("未找到对应模板权重信息");
        }

        // 2. 根据 templateId 获取 weights 列表
        List<SystemTemplateWeightOneVO> weights = systemTemplateManagementMapper.getWeightsById(templateId);

        // 3. 组装
        vo.setWeights(weights);

        return vo;
    }

//    11修改某一条模板权重信息
    @Override
    @Transactional
    public Boolean updateTemplateWeightOneById(SystemTemplateWeightUpdateDTO dto) {
        Integer templateId = dto.getTemplateId();
        List<SystemTemplateWeightUpdateItemsDTO> weights = dto.getWeights();

        if (templateId == null || weights == null || weights.isEmpty()) {
            return false;
        }

        for (SystemTemplateWeightUpdateItemsDTO item : weights) {
            Integer rows = systemTemplateManagementMapper.updateWeightByTemplateIdAndFactorId(
                    templateId, item.getFactorId(), item.getWeight()
            );
            if (rows == 0) {
                throw new RuntimeException("更新失败：factorId=" + item.getFactorId());
            }
        }

        return true;
    }
}
